#include "produtor.h"
#include <QDebug>

Produtor::Produtor(Buffer * buffer)
{
	this->buffer=buffer;
   // qDebug()<<"\nCriei um produtor";
}

void Produtor::escreve(){

       // qDebug()<<"\nComecei a escrever";
        srand(time(NULL));

        int dado = (int) rand()%this->buffer->bufferSize*3;
        ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(BLOQUEADOSINCRONISMO));
        this->buffer->semaforoLivres->acquire();
        ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(BLOQUEADOEXCLUSAO));
        this->buffer->mutex->lock();
                    ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(PRONTO));
                    this->buffer->setSaidaDoLabelSemaforos("Semaforo Usados = "+QString::number(buffer->semaforoUsados->available())+"  Semaforo Livres = "+QString::number(buffer->semaforoLivres->available())+"\n");
                        int temp=this->buffer->escreve(dado);
                        if(temp==1)
                        {
                                this->buffer->mutex->unlock();
                                ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(TERMINADO));
                                this->terminate();
                        }
                        this->buffer->setSaidaDoLabelSemaforos("escrevi "+QString::number(dado)+"\n");
                        this->buffer->showStatus();
                    this->buffer->setSaidaDoLabelSemaforos("Semaforo Usados = "+QString::number(buffer->semaforoUsados->available()+1)+"  Semaforo Livres = "+QString::number(buffer->semaforoLivres->available())+"\n");
                        int a;
                        sleep(1);

        this->buffer->mutex->unlock();
	this->buffer->semaforoUsados->release();

}
void Produtor::run(){
        while(1){
            ((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(PRONTO));
            escreve();
            //((ThreadModificada *) this->currentThread())->mudaEstado(ThreadModificada::Estado(SUSPENSO));
            //sleep(3);
        }
}
